package cn.kent.middle;

import java.util.HashMap;
import java.util.Map;

/**
 * 8. 字符串转换整数 (atoi)
 * todo:有限状态机 DFA
 */
public class MyAtoi {

    public static void main(String[] args) {
        String str = "_____hello 1234";
        System.out.println(myAtoi(str));
    }

    public static int myAtoi(String str) {
        Automaton automaton = new Automaton();
        int length = str.length();
        for (int i = 0; i < length; ++i) {
            automaton.get(str.charAt(i));
        }
        return (int) (automaton.sign * automaton.ans);
    }

    static class Automaton {
        public int sign = 1;
        public long ans = 0;
        private String state = "start";
        private Map<String, String[]> table = new HashMap<String, String[]>() {{
            put("start", new String[]{"start", "signed", "in_number", "end"});
            put("signed", new String[]{"end", "end", "in_number", "end"});
            put("in_number", new String[]{"end", "end", "in_number", "end"});
            put("end", new String[]{"end", "end", "end", "end"});
        }};

        public void get(char c) {
            state = table.get(state)[get_col(c)];
            if ("in_number".equals(state)) {
                ans = ans * 10 + c - '0';
                ans = sign == 1 ? Math.min(ans, (long) Integer.MAX_VALUE) : Math.min(ans, -(long) Integer.MIN_VALUE);
            } else if ("signed".equals(state)) {
                sign = c == '+' ? 1 : -1;
            }
        }

        private int get_col(char c) {
            if (c == ' ') {
                return 0;
            }
            if (c == '+' || c == '-') {
                return 1;
            }
            if (Character.isDigit(c)) {
                return 2;
            }
            return 3;
        }
    }


    // 错误
    // public static void main(String[] args) {
    //     // System.out.println(Integer.parseUnsignedInt("1234 hello"));
    //     System.out.println('-' - '0'); // -3
    //     System.out.println('+' - '0'); // -5
    //
    //     String s = " -0034 hello";
    //     System.out.println(myAtoi(s));
    // }
    //
    // public static int myAtoi(String s) {
    //     int len = s.length();
    //     char[] resC = new char[len];
    //     int count = 0; // resC 总数
    //     int i = 0; // 索引
    //     boolean p = true; // 正负
    //     while (i < len && count < 32) {
    //         int m = s.charAt(i) - '0';
    //         // 判断+ -
    //         if (m == -3) // init
    //             if (count == 0)
    //                 p = false;
    //             else
    //                 break;
    //         if (m == -5)
    //             if (count != 0)
    //                 break;
    //         if (9 >= m && m >= 0) {
    //             resC[count] = s.charAt(i);
    //             count++;
    //         } else if (count != 0)
    //             break;
    //         i++;
    //     }
    //     // 结果处理
    //     int i1 = Integer.parseInt(new String(resC, 0, count));
    //     return p ? i1 : -i1;
    // }
}
